#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 说明：继电器模块控制  林恩德  2022.6.18
#---------------------------------------
import RPi.GPIO as GPIO
import time
import threading
###继电器控制,接线时注意是链接常开（断开）还是常闭（闭合）节点。
# On时，常开点闭合，常闭节点关。
# Off时常开节点开，常闭节点比例。
class ElectricRelay:

    def __init__(self, relayPin=11):
        self.RelayPin = relayPin   # 定义继电器管脚为Pin11

    # 初始化工作
    def setup(self):
        GPIO.setmode(GPIO.BOARD)        # 采用实际的物理管脚给GPIO口
        GPIO.setwarnings(False)          # 去除GPIO警告
        GPIO.setup(self.RelayPin, GPIO.OUT)  # 设置Pin模式为输出模式
        GPIO.output(self.RelayPin, GPIO.LOW) # 关闭继电器	
    # 循环函数
    def loop(self,delay=0.5):
        while True:
            # 继电器打开
            GPIO.output(self.RelayPin, GPIO.HIGH)
            time.sleep(delay)                      # 延时500ms
            # 继电器关闭
            GPIO.output(self.RelayPin, GPIO.LOW)
            time.sleep(delay)  # 延时500ms

    #继电器打开,高电平触发,delay 延时关闭时长，asyn 是否为异步延时
    def on(self,delay=0,asyn=False):
        GPIO.output(self.RelayPin,GPIO.HIGH)
        if(delay>0):
            if(asyn==True):
                s = threading.Timer(delay,self.off)
                s.start()
            else:
                time.sleep(delay)
                self.off()
 
    #继电器关闭，低电平触发
    def off(self):
        GPIO.output(self.RelayPin,GPIO.LOW)
    # 释放资源

    def destroy(self):
        GPIO.output(self.RelayPin, GPIO.LOW) # 关闭继电器	
        GPIO.cleanup()                      # 释放资源

# 程序入口
if __name__ == '__main__':
    relay = ElectricRelay()
    relay.setup()           #  初始化
    try:
        relay.off()#loop()        #  调用循环函数
    except KeyboardInterrupt:  #  当按下Ctrl+C时，将执行destroy()子程序。
        relay.estroy()     #  释放资源
